package com.octopus.core.parser;

import com.octopus.core.Response;
import com.octopus.core.matcher.ParserMatcher;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;

/**
 * 分发解析器
 *
 * <p>根据匹配规则选择合适的解析器对下载内容进行解析
 *
 * @author yang_shoulai@hoperun.com
 * @date 2019/02/15
 */
@Slf4j
public final class DispatcherParser implements Parser {

  /** 实际解析器集合 */
  private List<ParserMatcher> parsers = new ArrayList<>();

  /**
   * 分发解析器构造
   *
   * @param parsers 实际解析器集合
   */
  public DispatcherParser(@NonNull ParserMatcher... parsers) {
    this.parsers.addAll(Arrays.asList(parsers));
  }

  @Override
  public ParseResult parse(Response response) throws ParseException {
    for (ParserMatcher parser : parsers) {
      if (parser.matches(response.request().url())) {
        return parser.parse(response);
      }
    }
    log.warn("No parser found for url: {}", response.request().url());
    return ParseResult.me();
  }
}
